#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <string.h>

// 头文件说明
/*
#include "cheadfile.h"
如果头文件用""，一般用于头文件和.c源文件在同一路径。编译器不需要指定路径。

#include <cheadfile.h>
用于标准库函数，不需要指定路径。
如果头文件和.c源文件不在同一路径，编译时需要用-I指定路径。
gcc -o test cheadfile.c -I./subdir

//1、头文件作用:用来做结构体定义，函数声明，变量声明，包含其他头文件，定义宏替换。
//2、头文件为了防止冲突，会用#ifndef __HEAD_FILE_T_H__ #define __HEAD_FILE_T_H__...#endif或者用#pragma once
//3、头文件不要定义变量！如果定义了变量，多个.cpp文件包含了同一个头文件，会报变量重定义。
*/
// 在编译时，会把头文件的内容展开到此.C源文件中。

#include "cheadfile.h" // 头文件也就是展开到本ｃ文件中．
#include <subhead.h>   // 头文件也就是展开到本ｃ文件中．

// 函数指针类型定义
typedef void (*commandFuncType)(void);

// 定义一个数组，保存函数指针
// 头文件已经声明了function1等函数，这里可以直接调用这些函数．
//　void function1(void);　在这里直接声明函数也是可以的．
commandFuncType commandFuncBuffer[] = {
    function1,
    function2,
    function3,
    function4};

int main(int argc, char **argv)
{
    // 如果没有在头文件声明全局变量，这里不能访问．
    // extern int globalValc;　在这里声明也可以．头文件也就是展开到本ｃ文件中．
    printf("[%s,%d]globalValc=%d\n", __FILE__, __LINE__, globalValc);
    for (int i = 0; i < sub_head_command_max; i++)
    {
        // 调用对应的函数指针。
        commandFuncBuffer[i]();
    }
    return 1;
}

// 全局变量定义,全局变量的定义不要放到头文件中。编译时会出现多次定义变量问题。
int globalValc = 12;

void function1(void)
{
    printf("[%s,%d]call funtion=%s\n", __FILE__, __LINE__, __func__);
}

void function2(void)
{
    printf("[%s,%d]call funtion=%s\n", __FILE__, __LINE__, __func__);
}

void function3(void)
{
    printf("[%s,%d]call funtion=%s\n", __FILE__, __LINE__, __func__);
}

void function4(void)
{
    printf("[%s,%d]call funtion=%s\n", __FILE__, __LINE__, __func__);
}
